package csm.common.thread;

/**
 * 작업 실행자 클래스. <br>
 * {@link Task} 클래스에서 Run에서 구현된 내용을 실제로 시작하는 클래스이다.
 *
 * @author seungmun
 * @since 2006.1.18
 * @see Task
 */
class TaskRunner extends Thread
{
    private Task      task = null;

    /**
     * 이 스레드의 실행을 탈출하기 위한 플래그.(True:작업을 중지하고, 탈출한다.)
     */
    protected boolean done;

    /**
     * 생성자.
     *
     * @param task
     *            실행 시킬 작업 개체.
     */
    public TaskRunner(Task task)
    {
        this.task = task;
        done = false;
        this.start();
    }

    /**
     * 이 스레드의 실행지점
     */
    public synchronized void run()
    {
        while (true)
        {
            try
            {
                wait();
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
            catch (Exception e) {
                e.printStackTrace();
            }

            if (done)
                break;

            task.run();
        }
    }

    /**
     * 모든 대기중인 쓰레드에게 알림메세지를 전파합니다.
     */
    public synchronized void notifier()
    {
        notify();
    }

}